/**
 * 数据库配置文件
 * 
 * 这个文件负责：
 * 1. 创建Sequelize实例（ORM工具）
 * 2. 配置数据库连接参数
 * 3. 定义数据模型
 * 4. 导出数据库实例和模型
 * 
 * 什么是ORM？Object-Relational Mapping，对象关系映射
 * 让我们可以用JavaScript对象的方式操作数据库，不用写SQL语句
 */

import { Sequelize, DataTypes } from 'sequelize'
import mysql from 'mysql2/promise'
import dotenv from 'dotenv'

// 加载环境变量
dotenv.config()

// 先收集数据库连接配置（后面可用于自动创建数据库）
const DB_NAME = process.env.DB_NAME || 'user_management'
const DB_USER = process.env.DB_USER || 'root'
const DB_PASSWORD = process.env.DB_PASSWORD || ''
const DB_HOST = process.env.DB_HOST || 'localhost'
const DB_PORT = Number(process.env.DB_PORT || 3306)

// 创建Sequelize实例（连接 MySQL 数据库）
// 小白解释：下面这些配置就像“登录数据库的账号密码和地址”
// DB_NAME 是数据库名，DB_USER/DB_PASSWORD 是账号密码，DB_HOST/DB_PORT 是地址和端口
const sequelize = new Sequelize(DB_NAME, DB_USER, DB_PASSWORD, {
  host: DB_HOST,
  port: DB_PORT,
  dialect: 'mysql',
  logging: process.env.NODE_ENV === 'development' ? console.log : false, // 开发环境打印 SQL 方便排查问题
  define: {
    timestamps: true,      // 自动加创建/更新时间字段
    underscored: true,     // 数据库字段使用下划线命名 created_at
    freezeTableName: true  // 表名固定，不自动变复数
  },
  pool: {
    max: 10,               // 最大连接数
    min: 0,
    acquire: 30000,        // 30秒获取不到连接就报错
    idle: 10000            // 10秒未使用的连接会被释放
  }
})

// 小白解释：如果数据库还没创建，我们帮你自动创建一下，避免报错“Unknown database”
async function ensureDatabaseExists() {
  let connection
  try {
    connection = await mysql.createConnection({
      host: DB_HOST,
      port: DB_PORT,
      user: DB_USER,
      password: DB_PASSWORD
    })
    await connection.query(
      `CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`
    )
    console.log(`✅ 已确认数据库存在：${DB_NAME}`)
  } catch (err) {
    console.error('❌ 自动创建数据库失败，请在 MySQL 手动创建：', err.message)
  } finally {
    if (connection) await connection.end()
  }
}

// 定义用户模型
// 什么是模型？对应数据库中的表结构，定义了数据的类型和约束
const User = sequelize.define('User', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,     // 主键
    autoIncrement: true,  // 自增
    comment: '用户ID'
  },
  name: {
    type: DataTypes.STRING(50),
    allowNull: false,     // 不允许为空
    validate: {          // 数据验证规则
      notEmpty: true,    // 不能为空字符串
      len: [2, 50]       // 长度限制：2-50个字符
    },
    comment: '用户姓名'
  },
  email: {
    type: DataTypes.STRING(100),
    allowNull: false,
    unique: true,        // 唯一约束（不能重复）
    validate: {
      isEmail: true      // 必须是邮箱格式
    },
    comment: '用户邮箱'
  },
  age: {
    type: DataTypes.INTEGER,
    allowNull: true,     // 允许为空
    validate: {
      min: 1,            // 最小值
      max: 120           // 最大值
    },
    comment: '用户年龄'
  },
  phone: {
    type: DataTypes.STRING(20),
    allowNull: true,
    comment: '手机号码'
  },
  address: {
    type: DataTypes.TEXT,
    allowNull: true,
    comment: '地址信息'
  },
  status: {
    type: DataTypes.ENUM('active', 'inactive'),  // 枚举类型
    defaultValue: 'active',                       // 默认值
    comment: '用户状态：active-活跃，inactive-禁用'
  }
}, {
  tableName: 'users',     // 数据库表名
  comment: '用户表'       // 表注释
})

// 定义数据库初始化函数
// 小白解释：这个函数就是“连接数据库、创建表、塞入几条示例数据”
const initDatabase = async () => {
  try {
    console.log('🔄 正在初始化数据库...')
    // 先确保数据库存在（如果不存在则自动创建）
    await ensureDatabaseExists()
    
    // 测试数据库连接
    await sequelize.authenticate()
    console.log('✅ 数据库连接成功！')
    
    // 同步所有模型（创建表）
    // force: false 表示如果表已存在，不会删除重建（避免数据丢失）
    await sequelize.sync({ force: false })
    console.log('✅ 数据库表同步完成！')
    
    // 检查是否需要插入初始数据
    const userCount = await User.count()
    if (userCount === 0) {
      console.log('📝 数据库为空，正在插入初始数据...')
      
      // 插入一些示例用户数据
      await User.bulkCreate([
        {
          name: '张三',
          email: 'zhangsan@example.com',
          age: 25,
          phone: '13800138000',
          address: '北京市朝阳区',
          status: 'active'
        },
        {
          name: '李四',
          email: 'lisi@example.com',
          age: 30,
          phone: '13900139000',
          address: '上海市浦东新区',
          status: 'active'
        },
        {
          name: '王五',
          email: 'wangwu@example.com',
          age: 28,
          phone: '13700137000',
          address: '广州市天河区',
          status: 'inactive'
        }
      ])
      
      console.log('✅ 初始数据插入完成！')
    }
    
    console.log('🎉 数据库初始化完成！')
    
  } catch (error) {
    console.error('❌ 数据库初始化失败：', error)
    throw error
  }
}

// 导出数据库实例和模型
export {
  sequelize,    // 数据库连接实例
  User,         // 用户模型
  initDatabase  // 初始化函数
}